lexer grammar YACCLexer;

options {
  language = Java;
}

tokens {

}

@header {
    package practica7;
}

@members {


     //////////////
     //RESERVADAS//
     //////////////
     public class Reservada {

        private String nombre;
        private int contador;
       
        public Reservada() {
                nombre = "";
                contador = 0;
        }

        public String getNombre() {
                return nombre;
        }

        public void setNombre(String nombre) {
                this.nombre = nombre;
        }

        public int getContador() {
                return contador;
        }
       
        public void incrementarContador() {
                contador++;
        }     
     }
     
     private ArrayList<Reservada> PalabrasReservadas = new ArrayList<Reservada>();
     
     public void ReservadaEncontrada (String palabra, ArrayList<Reservada> array) {
        boolean encontrado = false;
        for (int i = 0; i < array.size(); i++) {
            if (palabra.compareTo(array.get(i).getNombre()) == 0) {
               array.get(i).incrementarContador();
               encontrado = true;
            }
        }
        if (!encontrado) {
           Reservada r = new Reservada();
           r.setNombre(palabra);
           r.incrementarContador();
           array.add(r);
        }
     }
     
     public ArrayList<Reservada> getPalabrasReservadas() {
        return PalabrasReservadas;
     }
     
     
     //////////////
     //RESERVADAS//
     //////////////
     private int contadorBloque = 0;
     public void incrementarBloque (int cont) {
        contadorBloque++;
     }
     public void decrementarBloque (int cont) {
        contadorBloque--;
     }
     public int getContadorBloque() {
        return contadorBloque;
     }
     
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
 
}


BLANCO: (' '|'\t'|'\r\n'|'\n') {skip();};
fragment DIGITO: '0'..'9';
fragment LETRA: 'a'..'z'|'A'..'Z';
RET: 'return' {ReservadaEncontrada("return", PalabrasReservadas);};
FOR: 'for' {ReservadaEncontrada("for", PalabrasReservadas);};
WHILE: 'while' {ReservadaEncontrada("while", PalabrasReservadas);};
IF: 'if' {ReservadaEncontrada("if", PalabrasReservadas);};
ELSE:'else' {ReservadaEncontrada("else", PalabrasReservadas);};
PRINTF: 'printf' {ReservadaEncontrada("printf", PalabrasReservadas);};
INCLUIR: 'include' {ReservadaEncontrada("include", PalabrasReservadas);};
DEFINIR: 'define' {ReservadaEncontrada("define", PalabrasReservadas);};
TIPODEF: 'typedef' {ReservadaEncontrada("typedef", PalabrasReservadas);};
RECORD: 'struct' {ReservadaEncontrada("struct", PalabrasReservadas);};
INT: 'int' {ReservadaEncontrada("int", PalabrasReservadas);};
CHAR: 'char' {ReservadaEncontrada("char", PalabrasReservadas);};
VOID: 'void' {ReservadaEncontrada("void", PalabrasReservadas);};
DOBLE: 'double' {ReservadaEncontrada("double", PalabrasReservadas);};
CONTINUE: 'continue' {ReservadaEncontrada("continue", PalabrasReservadas);};
BREAK: 'break' {ReservadaEncontrada("break", PalabrasReservadas);};
REGISTRO: 'register';
INTERVALO: 'INTERVAL';
START: '%start';
UNION: '%union';
TOKEN: '%token';
TYPE: '%type';
LEFT: '%left';
RIGHT: '%right';
NONASSOC: '%nonassoc';
NUMERO: (DIGITO)+('.'(DIGITO)*)?;
IDENT: LETRA(LETRA|DIGITO)* EXTENSION?;
DOLAR: '$';
PSEUDOVAR: DOLAR DOLAR EXTENSION?;
VALOR:  PUNTO? (DOLAR (DIGITO)+) EXTENSION?;
EXTENSION: PUNTO IDENT;
OR: '|';
AND: '&';
IGUALQUE: '==';
MAYORQUE: '>';
MENORQUE: '<';
MAYORIGUALQUE: '>=';
MENORIGUALQUE: '<=';
IGUAL: '=';
SLASH: '/';
ALMOHADILLA: '#';
NOT: '!';
SLASH_INV: '\\';
COMILLA: '\'';
COMILLAS: '"';
PARENTESIS_A: '(';
PARENTESIS_C: ')';
CORCHETE_A: '[';
CORCHETE_C: ']';
ASTERISCO: '*';
COND_AND: '&&';
COND_OR: '||';
GUION: '-';
LLAVE_A: '{' {System.out.println(getContadorBloque()); incrementarBloque(contadorBloque);};
LLAVE_C: '}' {System.out.println(getContadorBloque()); decrementarBloque(contadorBloque);};
PORCENTAJE: '%';
NUEVOBLOQUE: '%%';
COMA: ',';
PUNTO: '.';
DOS_PUNTOS: ':';
PUNTO_COMA: ';';
COMENTARIO_A: '/*';
COMENTARIO_C: '*/';
SUMA: '+';
INCREMENTO: '++';
DECREMENTO: '--';
SIMBOLO: COMILLA SLASH_INV? (options {greedy=false;}:.) COMILLA;
CADENA: COMILLAS (options {greedy=false;}:.)* COMILLAS;
COMENTARIO: COMENTARIO_A (options {greedy=false;}:.)* COMENTARIO_C {skip();};
